package com.zpark.se.collection.list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;

/**
 * Collection集合常用方法
 */
public class Demo02 {
    public static void main(String[] args) {
        // 创建ArrayList集合
        ArrayList<String> lt = new ArrayList<>();

        // 随机添加5个元素
        lt.add("张三");
        lt.add("李四");
        lt.add("王五");
        lt.add("赵六");
        lt.add("田七");

        System.out.println(lt);
        System.out.println(lt.size());

        /*
            clear()：清空集合元素，将集合中的元素全部删除。
         */
        /*lt.clear();
        System.out.println(lt);
        System.out.println(lt.size());*/

        /*
            contains(Object o)：判断集合中是否包含指定的元素，如果包含，返回true，
            否则返回false。
         */
        boolean res = lt.contains("张三");
        System.out.println(res);

        // 定义集合
        List<String> lt1 = new ArrayList<>();
        lt1.add("张三");
        lt1.add("李四1");

        /*
            containsAll(Collection c)：判断当前集合中是否包含c集合中的所有元素，
         */
        boolean res1 = lt.containsAll(lt1);
        System.out.println(res1);

        /*
            ensureCapacity(int minCapacity)：设置集合的容量，不改变集合中元素的大小。
         */
        lt.ensureCapacity(6);
        System.out.println(lt.size());

        lt.add("王八");
        lt.add("赵九");
        System.out.println(lt.size());

        /*
            forEach(Consumer<? super E> action)：遍历集合元素，执行指定的操作。
         */
        lt.forEach(System.out::println);

        /*
            indexOf(Object o)：查找元素在集合中首次出现的位置，如果未找到，返回-1。
         */
        int index = lt.indexOf("王八");
        System.out.println(index);

        /*
            lastIndexOf(Object o)：查找元素在集合中最后一次出现的位置，如果未找到，返回-1。
         */
        int index1 = lt.lastIndexOf("王八");

        /*
          isEmpty()：判断集合是否为空，为空返回true，不为空返回false。
         */
        boolean empty = lt.isEmpty();
        System.out.println(empty);

        boolean empty1 = new ArrayList<Object>().isEmpty();
        System.out.println(empty1);

        // 创建一个迭代器来遍历字符串列表
        Iterator<String> iterator = lt.iterator();

        // 使用while循环遍历列表中的每个元素
        while (iterator.hasNext()) {
            // 获取列表中的下一个元素
            String next = iterator.next();
            /**
             * 注意在使用迭代器遍历集合的时候不允许修改集合元素
             * 否则ConcurrentModificationException
             */
            // lt.add("张三");
            // 打印当前元素
            System.out.println(next);
        }

        System.out.println("****************************************");

        System.out.println(lt);
        /*
            remove(Object o)：删除集合中首次出现的指定元素。
         */
        boolean b = lt.remove("王八");
        System.out.println(lt);

        /*
          remove(int index)：删除集合中指定索引位置的元素，并返回被删除的元素。
         */
        String s = lt.remove(3);
        System.out.println(s);
        System.out.println(lt);

        lt.add("张无忌");
        lt.add("张三丰");
        lt.add("张翠山");
        System.out.println(lt);

        /*
            removeIf(Predicate<? super E> filter)：移除集合中所有满足指定条件的元素。
         */
        // 使用removeIf方法移除集合中符合条件的元素
        lt.removeIf((Predicate) o -> {
            // 将对象转换为字符串
            String str = (String) o;
            // 检查字符串是否以"张"开头
            return str.startsWith("张");
        });
        System.out.println(lt);

        /*
            retainAll(Collection c)：保留集合中与c集合中相同的元素，删除集合中与c
            集合中不同的元素。
         */
        // lt.removeAll()

        /*
          replaceAll(UnaryOperator operator)：使用指定的操作符替换集合中的所有元素。
         */
        // lt.replaceAll();

        /*
            仅保留此列表中包含在指定集合中的元素。换句话说，从此列表中删除未包含在指定集合
            中的所有元素。
         */
        // lt.retainAll()

        /*
          sort()：对集合元素进行排序，默认使用元素的自然排序方式进行排序。
         */
        // lt.sort();

        /*
          spliterator()：返回在此列表中的元素上进行操作的 Spliterator。
         */
        // lt.spliterator()

        /*
          subList(int fromIndex, int toIndex)：返回此列表的子列表
          素 fromIndex（含）和 toIndex（不含）。
         */
        List<String> list = lt.subList(0, 3);
        System.out.println(list);

        /*
          toArray()：返回包含此列表中所有元素的数组。
         */
        Object[] array = lt.toArray();
        System.out.println(Arrays.toString(array));

        /*
          toArray(T[] a)：返回包含此列表中所有元素的数组。
         */
        String[] str = new String[lt.size()];
        String[] s1 = lt.toArray(str);
        System.out.println(Arrays.toString(s1));

        /*
          trimToSize()：根据当前元素数量，调整集合的容量，删除多余的容量。
         */
        lt.trimToSize();

        /*
          set(int index, E element)：用指定的元素替换此列表中指定位置的元素，
          并返回被替换的元素。
         */
        String s2 = lt.set(0, "张无忌");
        System.out.println(s2);
        System.out.println(lt);
    }
}
